philips hue per web state abfragen?

Begonnen von the ratman, 31 Mai 2016, 14:01:58

Vorheriges Thema - Nächstes Thema

the ratman

hi leute,

ich frag mich grade, was bei hue-devices so anders ist, oder was ich falsch eingestellt hab?
es geht um dumme aufrufe im browser wie z.b. http://192.168.178.10:8083/fhem?cmd=get%20Buecherregal_RGB%20param%20state
solange ich ein device abfrage, dass nicht zu philips hue gehört, ist das alles 0 problem, aber bei hue wehrt er sich vehement und ich darf nur 3 werte (rgb,RGB und devStateIcon) abfragen. leider fang ich mit allen 3 werten nichts an in diesem fall.

aja, mit list http://192.168.178.10:8083/fhem?cmd=list%20Buecherregal_RGB%20state
ergibt: Buecherregal_RGB 2016-05-31 13:17:46 off
  kann ich meinen state abfragen, aber den kann ich wieder nicht brauchbar zerlegen, weil ich für regexp definitiv zu dämlich bin. hab ich nie kapiert, werd ich wohl auch nie kapieren.
normal hab ich immerRegExp=(?siU)<div id="content">(.*)</div>.*verwendet, wobei (.*) der zu findende wert ist, aber mehr übersteigt mein können.

somit frag ich jetzt mal in die runde: was übersehe ich, wie komm ich an mein state oder auch pct bei hue mit get abfragen?
oder wer will mir beim regexp für list helfen und mirs eventuell gleich anhand des aktuellen bspl. erklären? vielleicht kapier ich ja dann mal ansatzweise wo und warum irgendwelche mondgesichter gemalt werden.
→do↑p!dnʇs↓shit←

justme1968

get ist wie set ein fhem kommando bei dem es vom device abhängt welche parameter unterstützt werden. welche das genau sind bekommst du z.b. mit get <device> ? raus.

ich habe/kenne kein einziges device bei dem man get <device> param state verwenden kann. das ist weder device unabhängig noch eine allgemeine methode auf bestimmte readings zuzugreifen.

der aktuelle device zustand spiegelte sich in einem oder mehreren readings wieder. ob das state ist und ob state ausschliesslich reicht hängt vom device ab. bei den hue lampen kannst du am state z.b. nicht sehen welche farbe gerade dargestellt wird. das gilt glaube ich auch für andere (farbige) lampen. wenn du wissen willst ob eine lampe ein oder aus ist nimm das onoff reading.

um gezielt ein reading abzufragen gibt es ReadingsVal. das kannst du auch url encoded in deine url stecken

wenn es mehrere readings und/oder mehrere devices sein sollen und die daten automatisiert weiter verarbeitet werden sollen bietet sich jsonlist2 oder xmllist an.

wenn du die fhem web schnittstelle automatisiert (d.h. nicht zur direkten anzeige im browser) verwenden willst solltest du ?XHR=1 an die url anhängen. dann bekommst du keine html seite sondern direkt die rückgabe deines kommandos.

mir ist nicht ganz klar was du genau vor hast, aber ich glaube dein ansatz ist noch nicht optimal bzw. du gehst es von der falschen seite und mit falschen annahmen an.

gruss
  andre
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

the ratman

#2
Zitat... du z.b. mit get <device> ? raus.
ja, weiß ich ... in dem fall: leider.

Zitatich habe/kenne kein einziges device bei dem man get <device> param state verwenden kann. das ist weder device unabhängig noch eine allgemeine methode auf bestimmte readings zuzugreifen.
naja, alles andere frißt meine abfragen - mit und ohne param is dem zeug scheints total egal ...

... sehen welche farbe gerade dargestellt wird.ich weiß, brauch ich in dem fall auch nicht. ich will ja nur on/off in dem fall. was die farbe angeht von hue - die krieg ich schon an anderer stelle rein und rechne sie auch problemlos in hex werte um (braucht man leider so beim rainmeter).

...nimm das onoff reading...jo, liebend gerne, sobald wir über mien problem bei list und regexp geredet haben *g*. bin ja - wie gesagt - schwerer regexp-legasteniker.

?XHR=1 is auch lieb - allerdings nicht, wenn du keine ahnung von regexp hast und nur nach beispielen filtern kannst, so wie ich. ich machs also lieber ohne, weil ich dann eindeutiges zeug im quelltext finden kann. wie gesagt ich weiß leider nicht, wie ich im regexp "hinter" das datum des state filtern kann, um dort dann den zustand abzugreifen.

damit du weißt, was ich vor hab: ich bastel wieder mal an einem skin für rainmeter, weil mein altes ja doch ein wenig "wirr" geschrieben war *g*. das dumme dran: früher hab ich das devstateicon bei hue abgefragt, das kann ich jetzt aber nicht mehr, weil ich das für den floorplan anderwertig befülle. damit du dir was drunter vorstellen kannst, meine ersten ergebnisse im anhang - das ist n ausschnitt des desktophintergrundes meines win-pc.
falls du dich zufällig mir rainmeter auskennst, konkret gehts um diesen ausgelagerten .ini, der jetzt natürlich unvollständig ist, weil ja noch on/off und pct fehlen.; Wohnzimmer Lampe Regal
; ----------------------

[MeasureParent_Wohnzimmer_Lampe_Regal]
Measure=Plugin
Plugin=WebParser
URL=http://#ip#/fhem?cmd=list Buecherregal_RGB state ;   <-- DAS MAG NICHT !!!!
RegExp=(?siU)<div id="content">(.*)</div>.*
UpdateRate=1

[Measure_Wohnzimmer_Lampe_Regal]
Measure=Plugin
Plugin=WebParser
URL=[MeasureParent_Wohnzimmer_Lampe_Regal]
StringIndex=1
Substitute="@.*":"","dim":"","on":"100","off":"0","%":""

IfMatch=on
IfMatchAction=[!HideMeter Meter_Wohnzimmer_Lampe_Regal_OPEN] [!ShowMeter Meter_Wohnzimmer_Lampe_Regal_CLOSED] [!Redraw]
IfMatch2=off
IfMatchAction2=[!ShowMeter Meter_Wohnzimmer_Lampe_Regal_OPEN] [!HideMeter Meter_Wohnzimmer_Lampe_Regal_CLOSED] [!Redraw]
IfMatchMode=1

[Meter_Wohnzimmer_Lampe_Regal_ON] ;<-- UNFERTIG
Meter=Roundline
MeasureName=[MeasureR] ;<-- DURCH ECHTES MEASSURE ERSETZEN, SOBALD VORHANDEN
X=300
Y=200
W=20
H=20
StartAngle=(-90*(PI/180))
RotationAngle=(360*(PI/180))
LineLength=10
LineColor=[MeasureConverted],100
Solid=1
AntiAlias=1

[Meter_Wohnzimmer_Lampe_Regal_OFF] ;<-- FEHLT NOCH GANZ

[MeasureHEX]
Measure=Plugin
Plugin=WebParser
URL=http://#ip#/fhem?cmd=get Buecherregal_RGB rgb
StringIndex=1
RegExpSubstitute=1
RegExp=(?siU)<div id="content">(.*)</div>.*
UpdateRate=1

; Umwandlung
; ----------

[MeasureR1]
Measure=String
String=[MeasureHEX]
RegExpSubstitute=1
Substitute="(.)(.)(.)(.)(.)(.)":"\1","a":"10","b":"11","c":"12","d":"13","e":"14","f":"15"
DynamicVariables=1

[MeasureR2]
Measure=String
String=[MeasureHEX]
RegExpSubstitute=1
Substitute="(.)(.)(.)(.)(.)(.)":"\2","a":"10","b":"11","c":"12","d":"13","e":"14","f":"15"
DynamicVariables=1

[MeasureG1]
Measure=String
String=[MeasureHEX]
RegExpSubstitute=1
Substitute="(.)(.)(.)(.)(.)(.)":"\3","a":"10","b":"11","c":"12","d":"13","e":"14","f":"15"
DynamicVariables=1

[MeasureG2]
Measure=String
String=[MeasureHEX]
RegExpSubstitute=1
Substitute="(.)(.)(.)(.)(.)(.)":"\4","a":"10","b":"11","c":"12","d":"13","e":"14","f":"15"
DynamicVariables=1

[MeasureB1]
Measure=String
String=[MeasureHEX]
RegExpSubstitute=1
Substitute="(.)(.)(.)(.)(.)(.)":"\5","a":"10","b":"11","c":"12","d":"13","e":"14","f":"15"
DynamicVariables=1

[MeasureB2]
Measure=String
String=[MeasureHEX]
RegExpSubstitute=1
Substitute="(.)(.)(.)(.)(.)(.)":"\6","a":"10","b":"11","c":"12","d":"13","e":"14","f":"15"
DynamicVariables=1

[MeasureR]
Measure=Calc
Formula=( 16 * [MeasureR1] + [MeasureR2] )
DynamicVariables=1

[MeasureG]
Measure=Calc
Formula=( 16 * [MeasureG1] + [MeasureG2] )
DynamicVariables=1

[MeasureB]
Measure=Calc
Formula=( 16 * [MeasureB1] + [MeasureB2] )
DynamicVariables=1

[MeasureConverted]
Measure=String
String=[MeasureR],[MeasureG],[MeasureB]
DynamicVariables=1


was mir also konkret weiterhelfen würde:
wie müsste der regexp lauten, damit ich bei dem list-ergebnis Buecherregal_RGB 2016-05-31 13:17:46 off an "off" komme?
→do↑p!dnʇs↓shit←

justme1968

zeig mir bitte ein device bei dem das geht.

get ist schlicht und einfach der falsche ansatz. das was du brauchst ist der wert eines readings.

XHR macht die regex viel einfacher weil das ganze html drum rum weg fällt. versuch es. selbst bei list wäre es einfacher. du musst dann z.b. nur noch von hinten alles nach dem ersten leerzeichen matchen: \s(.*)$

aber sogar das ist nicht nötig wenn du ReadingsVal nimmst. es kommt nur der wert des readings zurück. nichts sonst: http://192.168.178.10:8083/fhem?cmd=%7BReadingsVal(%27Buecherregal_RGB%27%2C%27onoff%27%2C0)%7D&XHR=1liefert nur 0oder1

steck einfach das kommando das du per telnet verwenden würdest {ReadingsVal('Buecherregal_RGB','onoff',0)} in online inline url encoding tool, häng ein &XHR=1 an und benutze es nach ?cmd= in deiner url.

gruss
  andre
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

the ratman

erst mal thx für deine mühe!

dein code liefert leider mehr zurück als 0 und 1<div id="content">
<a href="/fhem?detail=Buecherregal_RGB">Buecherregal_RGB</a>     2016-05-31 14:25:23    off
</div>
das könnte ich ja schon teilweise zerlegen, wenn da nicht dieses blöde datum wäre - ich weiß ja immer noch nicht, wie ich das per regexp rausfiltern kann.

ich sags halt sicherheitshalber nochmal: ich scheitere einzig und alleine daran, dass ich dieses 3 mal verfluchte regexp grundlegend nicht kapiere. der rest ist kein problem (in diesem fall zumindest *g*).
→do↑p!dnʇs↓shit←

justme1968

was hast du genau als url verwendet? das ist zwar ein list aber mit &XHR=1 kommt definitiv nur der wert ohne html code rum rum zurück. genau so wie es per telnet wäre.

die regex für das list habe ich dir oben schon geschrieben. bei ReadingsVal ist gar keine nötig bzw. (.*) für alles.

gruss
  andre
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

the ratman

#6
ja, wenn ichs 1:1 verwende, dann liefert der gute auch 0 oder 1.
nur, wenn ichs in den rainmeter leg, kommt nix oder schrott von früher.


rainmeter mag ohne regexp nicht so wirklich *g* aber (.*) abzufragen, schaff dann sogar ich ohne hilfe.

mann, ich habs *bg*
der rainmeter will seine texte in UCS2-Big Endian kodiert und rate mal, was ich gerne vergesse ... sehr fein find ich allerdings, dass er scheints alte daten nicht killed. nimmt er einfach alte werte, wenn er keine neuen kriegt.

fazit: funzt

*verbeug* und danke sag!
→do↑p!dnʇs↓shit←

the ratman

jetzt merk ich langsam, was du meintest *g*

mein eig. server beginnt mich immer öfters auszuperren, je mehr geräte ich in meine kleine übersicht einbinde.

jetzt frag ich mich natürlich, wie ich mit einem einzigen aufruf das erledigen kann. jsonlist2 usw. sind ja nette sachen, aber wie filtere ich da mehrere readings aus mehreren devices auf einmal raus?
ich brauch ja für eine anzahl devices, die weder in filterbaren räumen oder sonst wo sind, immer 1 bis 3 readings rausgezogen. vorzugsweise auch noch möglichst jede sekunde aufs neue, ohne dass mir alles zum spinnen anfangt.
ich bräuchte quasi sowas wie ne readingsgroup - nur, dass das ergebnis und keine internas dann kommen müssten.
dachte schon, ich schreib mir alle relevanten daten in ne mysql-db rein - *jubel* kann der rainmeter wieder nicht mit datenbanken umgehen.
das rss-modul auf "echten" rss umzubiegen und als werte anstelle gfx auszugeben scheint wohl auch nicht möglich zu sein, weil damit könnte der rainmeter wiederum was anfangen.

der onkel (wieder mal) ein wenig ratlos ist ...
→do↑p!dnʇs↓shit←

justme1968

ich kenne dein rainmeter nicht, aber die sauber lösung ist ein mal beim verbindungs aufbau alles per jsonlist2 abzufragen und sich dann an inform oder longpoll zu hängen und eine verbindung immer offen zu lassen.

das geht per telnet oder per web.

das ftui, homebridge und es gibt auch ein node.js modul dafür. für smatvisu gibt es mit frontem ein modul an das man sich genau so hängen kann.

zum filtern kannst du ein z.b. ein user attribut verwenden.

gruss
  andre
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

the ratman

#9
gut, telnet kann ich mir abschminken, das kann der rainmeter nicht. das ding ist ja eigentlich nur dazu gedacht systeminfos des lokalen rechners halbwegs schön darzustellen.

der rest muß mal angesehen werden - sobald die dinger per http kommunizieren können, müßts gehen - mal gucken, ob das problem zw. sessel und tastatur das hinbekommt *g*
wow, dachte frontem is extra für smartvisu gebastelt ... man lernt nie aus ...

dumm nur: ich find keine anleitungen für die ganzen module - meistens gehts ja da um anbindung von siri usw. - du hast da nicht zufällig links zu unterlagen, die das alles etwas genereller beschreiben?

auf jeden fall: danke für den denkanstoß in die richtige richtung!
→do↑p!dnʇs↓shit←