Variable doesn't trigger script

Moderator: leecollings

Post Reply
Dirk79
Posts: 3
Joined: Wednesday 26 September 2018 10:29
Target OS: Raspberry Pi / ODroid
Domoticz version: 4.9700
Contact:

Variable doesn't trigger script

Post by Dirk79 »

Hi All,

After a few days of searching I hope you can help me. I've got the following time script that updates a uservariable 'Night' with True of False:

commandArray = {}

--Haal de huidige tijd op
timenow = os.date("*t")
minutesnow = timenow.min + timenow.hour * 60

--Vergelijk de tijd met zonsondergang - 30 minuten en zet variabele Nacht op True als ze overeenkomen
if (minutesnow == timeofday['SunsetInMinutes'] - 30) then
commandArray['Variable:Nacht']='True'
end

--Vergelijk de tijd met zonsopgang - 0 minuten en zet variabele Nacht op False als ze overeenkomen
if (minutesnow == timeofday['SunriseInMinutes'] - 0) then
commandArray['Variable:Nacht']='False'
end

return commandArray

This works fine. The following uservariable script should be triggered when 'Night' is updated. The problem is that it isn't triggered:

commandArray = {}

if (uservariables['Thuis'] == 'True' and uservariables['Nacht'] == 'True') then
commandArray['Lampen bij bank']='On'
commandArray['Lamp bij tv']='On'
commandArray['Vensterbank']='On'
end

if uservariables['Thuis'] == 'False' then
commandArray['Lampen bij bank']='Off'
commandArray['Lamp bij tv']='Off'
commandArray['Vensterbank']='Off'
end

if uservariables['Nacht'] == 'False' then
commandArray['Lampen bij bank']='Off'
commandArray['Lamp bij tv']='Off'
commandArray['Vensterbank']='Off'
end

return commandArray

The other variable 'Home' is updated via API/JSON. When 'Night' is True all is fine and lights switch on.

Do you have ideas what might be the problem?
User avatar
jvdz
Posts: 2334
Joined: Tuesday 30 December 2014 19:25
Target OS: Raspberry Pi / ODroid
Domoticz version: 4.107
Location: Netherlands
Contact:

Re: Variable doesn't trigger script

Post by jvdz »

There use to be a remark in the Wiki about this, so don't know whether it has changed, but it use to be the case that UserVariable events would ONLY trigger when the uservariable was updated by a JSON call and not by a Commandarray[] action.
The remark isn't there anymore so maybe it was updated in a recent version?
My scripts still use a http request to update the variable with a JSON call to trigger the event system.

Jos
New Garbage collection scripts: https://github.com/jvanderzande/GarbageCalendar
Dirk79
Posts: 3
Joined: Wednesday 26 September 2018 10:29
Target OS: Raspberry Pi / ODroid
Domoticz version: 4.9700
Contact:

Re: Variable doesn't trigger script

Post by Dirk79 »

Thank you! Most likely that only JSON will trigger uservariable scripts then.

How did you write your http request in the script?

I've tried different 'versions' of the following line:

Code: Select all

commandArray['OpenURL']="http://127.0.0.1:8080/json.htm?param=updateuservariable&type=command&vname=Nacht&vtype=2&vvalue=False"
But keep getting errors:

Code: Select all

2018-09-26 16:05:56.788 Error: Error opening url: http://127.0.0.1:8080/json.htm?param=updateuservariable&type=command&vname=Nacht&vtype=2&vvalue=False
User avatar
emme
Posts: 909
Joined: Monday 27 June 2016 11:02
Target OS: Raspberry Pi / ODroid
Domoticz version: latest
Location: Milano, Italy
Contact:

Re: Variable doesn't trigger script

Post by emme »

look into the settings if 127.0.0.1 is in the IP whitelist

try also to open it into your browser (replacing 127.0.0.1 with the dz box ip) and post the error
The most dangerous phrase in any language is:
"We always done this way"
User avatar
jvdz
Posts: 2334
Joined: Tuesday 30 December 2014 19:25
Target OS: Raspberry Pi / ODroid
Domoticz version: 4.107
Location: Netherlands
Contact:

Re: Variable doesn't trigger script

Post by jvdz »

Try this variant without the http:// prefix:

Code: Select all

commandArray['OpenURL'] = "127.0.0.1:8080/json.htm?type=command&param=updateuservariable&vname=Nacht&vtype=2&vvalue=False"
Jos
New Garbage collection scripts: https://github.com/jvanderzande/GarbageCalendar
User avatar
waaren
Posts: 6028
Joined: Tuesday 03 January 2017 14:18
Target OS: Linux
Domoticz version: Beta
Location: Netherlands
Contact:

Re: Variable doesn't trigger script

Post by waaren »

jvdz wrote: Wednesday 26 September 2018 11:52 There use to be a remark in the Wiki about this, so don't know whether it has changed, but it use to be the case that UserVariable events would ONLY trigger when the uservariable was updated by a JSON call and not by a Commandarray[] action.
The remark isn't there anymore so maybe it was updated in a recent version?
My scripts still use a http request to update the variable with a JSON call to trigger the event system.

Jos
I just tested this with a Lua and with a dzVents script. The Lua script (using commandArray) does not trigger an event. The dzVents script does.
Debian buster, bullseye on RPI-4, Intel NUC.
dz Beta, Z-Wave, RFLink, RFXtrx433e, P1, Youless, Hue, Yeelight, Xiaomi, MQTT
==>> dzVents wiki
User avatar
jvdz
Posts: 2334
Joined: Tuesday 30 December 2014 19:25
Target OS: Raspberry Pi / ODroid
Domoticz version: 4.107
Location: Netherlands
Contact:

Re: Variable doesn't trigger script

Post by jvdz »

waaren wrote: Thursday 27 September 2018 10:51 I just tested this with a Lua and with a dzVents script. The Lua script (using commandArray) does not trigger an event. The dzVents script does.
That is pretty strange that we aren't worried about an indefinite trigger loop in dzVents and still are with LUA.
I've already mentioned this before that I never understood why this "safeguard" was build in for uservariables. It is just a nuisance having to resort to a JSON call to update a uservariable and want to trigger subsequent events.

I vote for changing this behavior. :)

Jos
New Garbage collection scripts: https://github.com/jvanderzande/GarbageCalendar
Dirk79
Posts: 3
Joined: Wednesday 26 September 2018 10:29
Target OS: Raspberry Pi / ODroid
Domoticz version: 4.9700
Contact:

Re: Variable doesn't trigger script

Post by Dirk79 »

Thanks for all the input guys! Whitelisting the IP did the trick.
OedzesG
Posts: 106
Joined: Monday 11 March 2019 0:14
Target OS: Raspberry Pi / ODroid
Domoticz version:
Contact:

Re: Variable doesn't trigger script

Post by OedzesG »

Hallo everyone!

Anny news on this?
I have a Plex script (python) witch updates my user variable, but when it changes (for example: Movie Pause) it is not triggering DzVents.
User avatar
waaren
Posts: 6028
Joined: Tuesday 03 January 2017 14:18
Target OS: Linux
Domoticz version: Beta
Location: Netherlands
Contact:

Re: Variable doesn't trigger script

Post by waaren »

OedzesG wrote: Friday 17 May 2019 11:02 I have a Plex script (python) witch updates my user variable, but when it changes (for example: Movie Pause) it is not triggering DzVents.
Can you change the script is such a way that it updates a virtual domoticz device ? That could trigger the dzVents script.
One way would be to use a selector switch and set it to a pre-defined level. Or just update the variable and switchOn a switch. dzVents would be triggered by the switch and read the value of the var in the body of the script.
Debian buster, bullseye on RPI-4, Intel NUC.
dz Beta, Z-Wave, RFLink, RFXtrx433e, P1, Youless, Hue, Yeelight, Xiaomi, MQTT
==>> dzVents wiki
OedzesG
Posts: 106
Joined: Monday 11 March 2019 0:14
Target OS: Raspberry Pi / ODroid
Domoticz version:
Contact:

Re: Variable doesn't trigger script

Post by OedzesG »

The script is updating a text device, but i dont know if i can get my trigger out of it!
Sorry, im not an expert in python cripting.

Exapple:
No media.JPG
No media.JPG (14.65 KiB) Viewed 2354 times
Play.JPG
Play.JPG (16.76 KiB) Viewed 2354 times
User avatar
waaren
Posts: 6028
Joined: Tuesday 03 January 2017 14:18
Target OS: Linux
Domoticz version: Beta
Location: Netherlands
Contact:

Re: Variable doesn't trigger script

Post by waaren »

OedzesG wrote: Friday 17 May 2019 17:24 The script is updating a text device, but i dont know if i can get my trigger out of it!
Can you please share the Python and dzVents scripts (and please use code tags </>) related to this question here ?
Debian buster, bullseye on RPI-4, Intel NUC.
dz Beta, Z-Wave, RFLink, RFXtrx433e, P1, Youless, Hue, Yeelight, Xiaomi, MQTT
==>> dzVents wiki
OedzesG
Posts: 106
Joined: Monday 11 March 2019 0:14
Target OS: Raspberry Pi / ODroid
Domoticz version:
Contact:

Re: Variable doesn't trigger script

Post by OedzesG »

Spoiler: show

Code: Select all

!/usr/bin/python
# -*- coding: utf-8 -*-
from __future__ import division
import traceback
import sys
import datetime
import time
import os
import urllib, urllib2, hashlib,subprocess
from xml.etree import ElementTree as ET


ErrorCount = 0
#general Script settings
plex_Interval                 = 4     # Poll Interval. The Plex Server updates the session status every 10 seconds. Leave at 5 to not mis any state change.
plex_ShowPlayProgress         = True 
plex_AutoClearPlayLog         = True  # Should be enabled when showing Play Progress
plex_AutoCreateUserVariables  = True  # Automatically create a user variable for each Client listed under dom_PlexPlayers
plex_ViewOffsetTimeout        = 20    # In seconds.
plex_MaxErrorCount            = 3     # number of consecutive errors until Plex is considered Offline

#RunState values (for user variable)
plex_ServerOffline    = -1
plex_Idle             = 0
plex_Video_Playing    = 1
plex_Video_Paused     = 2
plex_Video_Stopped    = 3
plex_Video_Buffering  = 4
plex_Audio_Playing    = 11
plex_Audio_Paused     = 12
plex_Audio_Stopped    = 13
plex_Audio_Buffering  = 14

#Plex Server Settings
plexIP                 = '192.168.2.142'
plexPort               = '32400'          # (default port = 32400)
plexToken              = ''

#domoticz settings
domoticz_host          = '192.168.2.148'
domoticz_port          = '8080'
domoticz_url           = 'json.htm'

#Translation Array - It's also possible to specify custom search strings. Place them at the beginning of the array.
transl_search 	= ['Playing','Stopped','Buffering','Paused','Video','Movie','Episode','Clip','Audio','Slideshow']
transl_replace 	= ['','','','','','','','','',''] #place replacement string on the same index as the search string. empty strings are not processed.

#Plex Players Settings - This script handles multiple players
dom_PlexPlayers        = ['OpenELEC-PHT','Jasper-TPC'] #Players not on this list will be ignored
dom_PlexPlayInfo_ID    = ['24','30']
dom_PlexPlayState_ID   = ['','']          # Name of User Variable. Is overwrriten when plex_AutoCreateUserVariables=True

#Various Variables
plex_TimeLastUpdate    = ""
plex_LastOffsetUpdate  = []  # of loop iterations
plex_LastOffset        = []
plex_PreviousState     = []
plex_PreviousTitle     = []
plex_AlreadyIdle       = []

#building url
requestURL = 'http://'+ plexIP + ':' + plexPort + '/status/sessions?X-Plex-Token=' + plexToken

#lock file
pidfile = sys.argv[0] + '_' + plexIP + '.pid'
if os.path.isfile( pidfile ):
  if (time.time() - os.path.getmtime(pidfile)) < (float(5) * 4):
    print datetime.datetime.now().strftime("%H:%M:%S") + "- script seems to be still running, exiting"
    print datetime.datetime.now().strftime("%H:%M:%S") + "- If this is not correct, please delete file " + pidfile
    sys.exit(0)
  else:
    print datetime.datetime.now().strftime("%H:%M:%S") + "- Seems to be an old file, ignoring."
else:
  open(pidfile, 'w').close()

#Ensure equal list sizes
while len(dom_PlexPlayInfo_ID)<len(dom_PlexPlayers):
  dom_PlexPlayInfo_ID.append('-1')
while len(dom_PlexPlayState_ID)<len(dom_PlexPlayers):
  dom_PlexPlayState_ID.append('-1')
while len(plex_LastOffsetUpdate)<len(dom_PlexPlayers):
  plex_LastOffsetUpdate.append(1)
while len(plex_LastOffset)<len(dom_PlexPlayers):
  plex_LastOffset.append(1)
while len(plex_PreviousState)<len(dom_PlexPlayers):
  plex_PreviousState.append('0')
while len(plex_PreviousTitle)<len(dom_PlexPlayers):
  plex_PreviousTitle.append('0')
while len(plex_AlreadyIdle)<len(dom_PlexPlayers):
  plex_AlreadyIdle.append(False)
while len(transl_replace)<len(transl_search):
  transl_replace.append('')

statusValue = 0
# create play Status user variable for each client
if plex_AutoCreateUserVariables:
  for client in dom_PlexPlayers:
    try:
      name = "PLEX STATUS [" + client + "]"
      url = "http://" + domoticz_host + ":" + domoticz_port + "/" + domoticz_url+ "?type=command&param=saveuservariable&vname=" + name + "&vtype=Integer&vvalue=" + str(plex_Idle)
      url = urllib.quote(url.encode('utf-8'), safe="%/:=&?~#+!$,;'@()*[]'")
      urllib2.urlopen(url , timeout = 5)
      idx = dom_PlexPlayers.index(client)
      dom_PlexPlayState_ID[idx] = name
    except Exception:
      print 'Connection Error'
 
def translate(playstring):
  returnstring = playstring
  for idx in range(0, len(transl_search)):
    if transl_replace[idx]!='':
      returnstring = returnstring.replace(transl_search[idx],transl_replace[idx])
  print returnstring;
  return returnstring; 
  
while 1==1:
  try:
    #call session url
    test = urllib2.urlopen(requestURL,timeout = 5).read()
    root = ET.XML(test)
    ProcessedIDs=[]
    #Video Support
    for video in root.findall('Video'):
      # Get Attributes for each player
      player = video.find('Player').attrib['title']
      state = video.find('Player').attrib['state']
      parenttitle = video.get('grandparentTitle')
      videotitle = video.get('title')
      videotype = video.get('type')
      videoduration = video.get('duration')
      viewOffset = video.get('viewOffset')
      PlayProgress=''
      if plex_ShowPlayProgress and videoduration is not None:
        durTotalSeconds = long(long(videoduration) / 1000)
        durSeconds = int(durTotalSeconds % 60)
        durTotalSeconds /=60
        durMinutes = int(durTotalSeconds % 60)
        durTotalSeconds /=60
        durHours = int(durTotalSeconds)
        if viewOffset is not None:
          runTotalSeconds = long(long(viewOffset) / 1000)
          runSeconds = int(runTotalSeconds % 60)
          runTotalSeconds /=60
          runMinutes = int(runTotalSeconds % 60)
          runTotalSeconds /=60
          runHours = int(runTotalSeconds)
        else:
          runSeconds=0
          runMinutes=0
          runHours=0
        PlayProgress= ' (' + str(runHours) + ':' + str(runMinutes).zfill(2) + ':' + str(runSeconds).zfill(2) + '/' + str(durHours) + ':' + str(durMinutes).zfill(2) + ':' + str(durSeconds).zfill(2) + ')'
      else:
        PlayProgress=""
      PlayString = ""
      StateChange = 0
      PlayerID = dom_PlexPlayers.index(player) if player in dom_PlexPlayers else -1
      if PlayerID >= 0:  #only process players that are on the list
        try:
          # Check if there is progress
          if (viewOffset>plex_LastOffset[PlayerID] and state=="playing") or  (videotitle!=plex_PreviousTitle[PlayerID]):
            plex_LastOffsetUpdate[PlayerID] = 0
          elif viewOffset == plex_LastOffset[PlayerID]:
            plex_LastOffsetUpdate[PlayerID] += 1

          if plex_LastOffsetUpdate[PlayerID] >= int(plex_ViewOffsetTimeout/plex_Interval) and state == "playing" and viewOffset is not None:
            state = "stopped"

          if plex_PreviousState[PlayerID] == state:
            StateChange = 0
          else:
            StateChange = 1
            plex_PreviousState[PlayerID]=state

          plex_PreviousTitle[PlayerID] = videotitle
          
          if videotype == 'movie':
            PlayString = state.capitalize() + " Movie: " + videotitle + PlayProgress
          elif videotype =='episode':
            PlayString = state.capitalize() + " Episode: " + parenttitle + " - " + videotitle + PlayProgress
          elif videotype =='clip':
            PlayString = state.capitalize() + " Clip: " + parenttitle + " - " + videotitle + PlayProgress
          else:
            PlayString = state.capitalize() + "Video " + ": " + videotitle + PlayProgress
          #uploading log message to domoticz
          PlayString = urllib.quote(translate(PlayString).encode("utf-8"))
          if StateChange == 1:
            url = "http://" + domoticz_host + ":" + domoticz_port + "/" + domoticz_url + "?type=command&param=addlogmessage&message=" + PlayString
            urllib2.urlopen(url , timeout = 5)
            plex_AlreadyIdle[PlayerID] = False
          #uploading values to domoticz
          url = "http://" + domoticz_host + ":" + domoticz_port + "/" + domoticz_url + "?type=command&param=udevice&idx=" + dom_PlexPlayInfo_ID[PlayerID] + "&nvalue=0&svalue=" + PlayString
          urllib2.urlopen(url , timeout = 5)
          
          if state == "playing":
            statusValue = plex_Video_Playing
          elif state == "paused":
            statusValue = plex_Video_Paused
          elif state == "stopped":
            statusValue = plex_Video_Stopped
          elif state =="buffering":
            statusValue = plex_Video_Buffering

          if plex_LastOffset[PlayerID] != viewOffset or state == "stopped":
            if plex_AutoClearPlayLog:
              url = "http://" + domoticz_host + ":" + domoticz_port + "/" + domoticz_url + "?type=command&param=clearlightlog&idx=" + dom_PlexPlayInfo_ID[PlayerID]
              urllib2.urlopen(url , timeout = 5)
          if StateChange == 1:
            url = ("http://" + domoticz_host + ":" + domoticz_port + "/" + domoticz_url + "?type=command&param=updateuservariable&vname=" + dom_PlexPlayState_ID[PlayerID] + "&vtype=integer&vvalue=" + str(statusValue))
            url = urllib.quote(url.encode('utf-8'), safe="%/:=&?~#+!$,;'@()*[]'")
            urllib2.urlopen(url,timeout = 5)
          plex_LastOffset[PlayerID] = viewOffset
          
          ProcessedIDs.append(PlayerID)
      
        except Exception,e:
          print 'IDLE'
          print e
          print traceback.print_exc()
          #uploading values to domoticz
          
          url = ("http://" + domoticz_host + ":" + domoticz_port + "/" + domoticz_url+ "?type=command&param=udevice&idx=" + dom_PlexPlayInfo_ID[PlayerID] + "&nvalue=0&svalue=No%20Media%20Playing")
          urllib2.urlopen(url,timeout = 5)
          pass
    #Audio Support
    for audio in root.findall('Track'):
      # Get Attributes for each player
      player = audio.find('Player').attrib['title']
      state = audio.find('Player').attrib['state']
      parenttitle = "Unknown"
      parenttitle = audio.get('grandparentTitle')
      audiotitle = audio.get('title')
      audioduration = audio.get('duration')
      viewOffset = audio.get('viewOffset')
      PlayProgress=''
      if plex_ShowPlayProgress:
        durTotalSeconds = long(long(audioduration) / 1000)
        durSeconds = int(durTotalSeconds % 60)
        durTotalSeconds /=60
        durMinutes = int(durTotalSeconds % 60)
        durTotalSeconds /=60
        durHours = int(durTotalSeconds)
        if viewOffset is not None:
          runTotalSeconds = long(long(viewOffset) / 1000)
          runSeconds = int(runTotalSeconds % 60)
          runTotalSeconds /=60
          runMinutes = int(runTotalSeconds % 60)
          runTotalSeconds /=60
          runHours = int(runTotalSeconds)
        else:
          runSeconds=0
          runMinutes=0
          runHours=0
        PlayProgress= ' (' + str(runHours) + ':' + str(runMinutes).zfill(2) + ':' + str(runSeconds).zfill(2) + '/' + str(durHours) + ':' + str(durMinutes).zfill(2) + ':' + str(durSeconds).zfill(2) + ')'
      else:
        PlayProgress=""
      PlayString = ""
      StateChange = 0
      PlayerID = dom_PlexPlayers.index(player) if player in dom_PlexPlayers else -1
      if PlayerID >= 0:  #only process players that are on the list
        try:
          # Check if there is progress
          if (viewOffset>plex_LastOffset[PlayerID] and state=="playing") or  (audiotitle!=plex_PreviousTitle[PlayerID]):
            plex_LastOffsetUpdate[PlayerID] = 0
          elif viewOffset == plex_LastOffset[PlayerID]:
            plex_LastOffsetUpdate[PlayerID] += 1

          if plex_LastOffsetUpdate[PlayerID] >= int(plex_ViewOffsetTimeout/plex_Interval) and state == "playing":
            state = "stopped"

          if plex_PreviousState[PlayerID] == state:
            StateChange = 0
          else:
            StateChange = 1
            plex_PreviousState[PlayerID]=state

          plex_PreviousTitle[PlayerID] = audiotitle
          PlayString = state.capitalize() + " Audio: " + parenttitle + " - " + audiotitle + PlayProgress
          PlayString = urllib.quote(translate(PlayString).encode('utf-8'))
          #uploading log message to domoticz
          if StateChange == 1:
            url = "http://" + domoticz_host + ":" + domoticz_port + "/" + domoticz_url + "?type=command&param=addlogmessage&message=" + PlayString
            urllib2.urlopen(url , timeout = 5)
            plex_AlreadyIdle[PlayerID] = False
          #uploading values to domoticz
          url = "http://" + domoticz_host + ":" + domoticz_port + "/" + domoticz_url + "?type=command&param=udevice&idx=" + dom_PlexPlayInfo_ID[PlayerID] + "&nvalue=0&svalue=" + PlayString
          urllib2.urlopen(url , timeout = 5)
          
          if state == "playing":
            statusValue = plex_Audio_Playing
          elif state == "paused":
            statusValue = plex_Audio_Paused
          elif state == "stopped":
            statusValue = plex_Audio_Stopped
          elif state =="buffering":
            statusValue = plex_Audio_Buffering

          if plex_LastOffset[PlayerID] != viewOffset:
            if plex_AutoClearPlayLog:
              url = "http://" + domoticz_host + ":" + domoticz_port + "/" + domoticz_url + "?type=command&param=clearlightlog&idx=" + dom_PlexPlayInfo_ID[PlayerID]
              urllib2.urlopen(url , timeout = 5)
          if StateChange == 1:
            url = ("http://" + domoticz_host + ":" + domoticz_port + "/" + domoticz_url + "?type=command&param=updateuservariable&vname=" + dom_PlexPlayState_ID[PlayerID] + "&vtype=integer&vvalue=" + str(statusValue))
            url = urllib.quote(url.encode('utf-8'), safe="%/:=&?~#+!$,;'@()*[]'")
            urllib2.urlopen(url,timeout = 5)
          plex_LastOffset[PlayerID] = viewOffset
          ProcessedIDs.append(PlayerID)
      
        except Exception,e:
          print 'IDLE'
          print e
          print traceback.print_exc()
          #uploading values to domoticz
          
          url = ("http://" + domoticz_host + ":" + domoticz_port + "/" + domoticz_url+ "?type=command&param=udevice&idx=" + dom_PlexPlayInfo_ID[PlayerID] + "&nvalue=0&svalue=No%20Media%20Playing")
          urllib2.urlopen(url,timeout = 5)
          pass
    for photo in root.findall('Photo'):
      # Get Attributes for each player
      player = photo.find('Player').attrib['title']
      state = photo.find('Player').attrib['state']
      parenttitle = "Unknown"
      parenttitle = photo.get('parentTitle')
      phototitle = photo.get('title')
      PlayString = ""
      StateChange = 0
      PlayerID = dom_PlexPlayers.index(player) if player in dom_PlexPlayers else -1
      if PlayerID >= 0:  #only process players that are on the list
        try:
          if plex_PreviousState[PlayerID] == state:
            StateChange = 0
          else:
            StateChange = 1
            plex_PreviousState[PlayerID]=state
          plex_PreviousTitle[PlayerID] = phototitle
          PlayString = state.capitalize() + " Slideshow: " + parenttitle + " - " + phototitle
          PlayString = urllib.quote(translate(PlayString).encode('utf-8'))
          #uploading log message to domoticz
          if StateChange == 1:
            url = "http://" + domoticz_host + ":" + domoticz_port + "/" + domoticz_url + "?type=command&param=addlogmessage&message=" + PlayString
            urllib2.urlopen(url , timeout = 5)
            plex_AlreadyIdle[PlayerID] = False
            #uploading values to domoticz
            url = "http://" + domoticz_host + ":" + domoticz_port + "/" + domoticz_url + "?type=command&param=udevice&idx=" + dom_PlexPlayInfo_ID[PlayerID] + "&nvalue=0&svalue=" + PlayString
            urllib2.urlopen(url , timeout = 5)
            if state == "playing":
              statusValue = plex_Audio_Playing
            elif state == "paused":
              statusValue = plex_Audio_Paused
            elif state == "stopped":
              statusValue = plex_Audio_Stopped
            url = ("http://" + domoticz_host + ":" + domoticz_port + "/" + domoticz_url + "?type=command&param=updateuservariable&vname=" + dom_PlexPlayState_ID[PlayerID] + "&vtype=integer&vvalue=" + str(statusValue))
            url = urllib.quote(url.encode('utf-8'), safe="%/:=&?~#+!$,;'@()*[]'")
            urllib2.urlopen(url,timeout = 5)

          ProcessedIDs.append(PlayerID)
      
        except Exception,e:
          print 'IDLE'

          #uploading values to domoticz
          url = ("http://" + domoticz_host + ":" + domoticz_port + "/" + domoticz_url+ "?type=command&param=udevice&idx=" + dom_PlexPlayInfo_ID[PlayerID] + "&nvalue=0&svalue=No%20Media%20Playing")
          urllib2.urlopen(url,timeout = 5)
          pass
    #set play status to IDLE
    for i in range(0, len(dom_PlexPlayers)):
      if i not in ProcessedIDs and plex_AlreadyIdle[i] == False:
        plex_PreviousState[i]=-2
        print 'No Media Playing'
        url = ("http://" + domoticz_host + ":" + domoticz_port + "/" + domoticz_url+ "?type=command&param=udevice&idx=" + dom_PlexPlayInfo_ID[i] + "&nvalue=0&svalue=No%20Media%20Playing")
        urllib2.urlopen(url,timeout = 5)
        url = ("http://" + domoticz_host + ":" + domoticz_port + "/" + domoticz_url+ "?type=command&param=updateuservariable&vname=" + dom_PlexPlayState_ID[i] + "&vtype=integer&vvalue=0")
        url = urllib.quote(url.encode('utf-8'), safe="%/:=&?~#+!$,;'@()*[]'")
        urllib2.urlopen(url,timeout = 5)
        plex_AlreadyIdle[i] = True
    ErrorCount = 0 
  except Exception,e:
   print traceback.print_exc()
   try:
      ErrorCount+=1
      if ErrorCount == plex_MaxErrorCount:
         print 'PLEX OFFLINE'
         for i in range(0, len(dom_PlexPlayers)):
            if plex_AlreadyIdle[i] == False:
               url = ("http://" + domoticz_host + ":" + domoticz_port + "/" + domoticz_url+ "?type=command&param=udevice&idx=" + dom_PlexPlayInfo_ID[i] + "&nvalue=0&svalue=No%20Media%20Playing")
               urllib2.urlopen(url,timeout = 5)
               url = ("http://" + domoticz_host + ":" + domoticz_port + "/" + domoticz_url+ "?type=command&param=updateuservariable&vname=" + dom_PlexPlayState_ID[i] + "&vtype=integer&vvalue=" + str(plex_ServerOffline))
               url = urllib.quote(url.encode('utf-8'), safe="%/:=&?~#+!$,;'@()*[]'")
               urllib2.urlopen(url,timeout = 5)
               plex_AlreadyIdle[i] = True
               pass
   except Exception,e:
     print traceback.print_exc()
  time.sleep (plex_Interval)
  open(pidfile, 'w').close()
OedzesG
Posts: 106
Joined: Monday 11 March 2019 0:14
Target OS: Raspberry Pi / ODroid
Domoticz version:
Contact:

Re: Variable doesn't trigger script

Post by OedzesG »

And this is the script..
I am just started with domoticz, so hope the script is oke!?
Dzventz.JPG
Dzventz.JPG (40.54 KiB) Viewed 2350 times
User avatar
waaren
Posts: 6028
Joined: Tuesday 03 January 2017 14:18
Target OS: Linux
Domoticz version: Beta
Location: Netherlands
Contact:

Re: Variable doesn't trigger script

Post by waaren »

OedzesG wrote: Friday 17 May 2019 17:34 And this is the script..
I am just started with domoticz, so hope the script is oke!?

Dzventz.JPG
Please use code tags ( use </> button in the edit window and put your code between the tags )
Debian buster, bullseye on RPI-4, Intel NUC.
dz Beta, Z-Wave, RFLink, RFXtrx433e, P1, Youless, Hue, Yeelight, Xiaomi, MQTT
==>> dzVents wiki
User avatar
waaren
Posts: 6028
Joined: Tuesday 03 January 2017 14:18
Target OS: Linux
Domoticz version: Beta
Location: Netherlands
Contact:

Re: Variable doesn't trigger script

Post by waaren »

OedzesG wrote: Friday 17 May 2019 17:34 And this is the script..
I am just started with domoticz, so hope the script is oke!?
Can you try this ?

Code: Select all

return {
        on = {  devices = { 'Plex_Status_Chrome' }},
                
    logging =   {   level   =   domoticz.LOG_DEBUG,
                    marker  =   "plexTest" },
    
    execute = function(dz)
        plexVar = dz.variables('PLEX STATUS [Chrome]')
        testSwitch = dz.devices('test1')
        
        if tostring(plexVar.value) == '1' then 
            testSwitch.switchOn()
        elseif tostring(plexVar.value) == '2' then
            testSwitch.switchOff()
        end
        
        dz.log('Value of vatiable ' .. plexVar.name .. " is " .. plexVar.value,dz.log_DEBUG )    
    end
}

Debian buster, bullseye on RPI-4, Intel NUC.
dz Beta, Z-Wave, RFLink, RFXtrx433e, P1, Youless, Hue, Yeelight, Xiaomi, MQTT
==>> dzVents wiki
OedzesG
Posts: 106
Joined: Monday 11 March 2019 0:14
Target OS: Raspberry Pi / ODroid
Domoticz version:
Contact:

Re: Variable doesn't trigger script

Post by OedzesG »

IT WORKS !!! amazing!!!

But.......... the script is updating every X seconds, so my log is going crazy right now.
WORKS!!!.JPG
WORKS!!!.JPG (40.72 KiB) Viewed 2323 times
User avatar
waaren
Posts: 6028
Joined: Tuesday 03 January 2017 14:18
Target OS: Linux
Domoticz version: Beta
Location: Netherlands
Contact:

Re: Variable doesn't trigger script

Post by waaren »

OedzesG wrote: Friday 17 May 2019 18:18 But.......... the script is updating every X seconds, so my log is going crazy right now.
It only means that the text sensor is updated (very) frequently. If you don't wan't to fill your log and only send a command to the switch when it should change state then adjust script to

Code: Select all

return {
        on = { 
                devices = { 'Plex_Status_Chrome' }},
                
    logging =   {   level   =   domoticz.LOG_ERROR,
                    marker  =   "plexTest" },
    
    execute = function(dz)
        plexVar = dz.variables('PLEX STATUS [Chrome]')
        testSwitch = dz.devices('test1')
        
        if tostring(plexVar.value) == '1' then 
            testSwitch.switchOn().checkFirst()
        elseif tostring(plexVar.value) == '2' then
            testSwitch.switchOff().checkFirst()
        end
        
        -- dz.log('Value of vatiable ' .. plexVar.name .. " is " .. plexVar.value,dz.log_DEBUG )
    end
}
Debian buster, bullseye on RPI-4, Intel NUC.
dz Beta, Z-Wave, RFLink, RFXtrx433e, P1, Youless, Hue, Yeelight, Xiaomi, MQTT
==>> dzVents wiki
Soulwax62
Posts: 2
Joined: Friday 14 January 2022 12:38
Target OS: Linux
Domoticz version:
Contact:

Re: Variable doesn't trigger script

Post by Soulwax62 »

Just to up the topic, just tested on very last version (2022.1) still, lua's scripts updating user variables doesn't trigger a change event.

So problem is still there on this version.

I will implement the json API response from here.

Thank you for the workaround.

Soulwax62
Post Reply

Who is online

Users browsing this forum: No registered users and 1 guest