Neue Version von HTTPMOD mit neuen Features zum Testen

Begonnen von StefanStrobel, 05 Dezember 2015, 08:31:32

Vorheriges Thema - Nächstes Thema

Heiner33

Hallo zusammen,

ich hätte da auch schnell eine kurze Frage zu HTTPMOD. Und zwar versuche ich einen Teil der URL dynamisch zu ersetzen mit einer Perl Expression, die mir diesen Wert generiert.

Mein HTTPMOD-Device hat folgende DEF:
DEF https://httpbin.org/get?value=%%DATETIME%%
Die Attribute sehen so aus:
attr httpmod_test replacement0Mode expression
attr httpmod_test replacement0Regex %%DATETIME%%
attr httpmod_test replacement0Value { return "dummy_date_value"; }

Wenn ich mir mit verbose 5 das Log anschaue, dann sehe ich, dass in der URL der "%%DATETIME%%"-Teil nicht ersetzt wurde durch "dummy_date_value".

Könnt ihr mir bitte einen Hinweis geben, was ich falsch mache?

Vielen Dank!

Jostar

#1291
Hallo,

sieht eigentlich plausibel aus, du versuchst mit "get" ein Wert zu übertragen und hoffst also dabei schon auf Ersetzung?

Ich nutze dazu Set und die zusätzlichen Attribute:
Set01Data/Name/URL

Mit http*s* habe ich es aber auch noch nie probiert.

Grüße
Raspberry Pi(s) mit FHEM auf Rasbian Jessie/Strech, DbLog/DbRep mit mySQL, piface, 1Wire-USB-Master von SMS-GUARD, RFXtrx433E

Heiner33

#1292
Hallo,

ja ich verwende nur die URL in der Device Definition selbst, habe keine weiteren Set oder Get-URLs hinterlegt, die brauche ich eigentlich nicht, dachte ich? Vielleicht verstehe ich aber auch grundsätzlich etwas nicht?

Hab mal ein bisschen im Coding des 98_HTTMOD.pm gewühlt und ein paar zusätzliche Loggings-Steps aktiviert. Mein Fehler war ziemlich banal...
Hab meine Attribute jetzt umbenannt in

replacement01Mode
replacement01Regex
replacement01Value

Und jetzt funktioniert es... :-)

Danke und Grüße

betateilchen

#1293
Das ist der komplett falsche Thread für Deine Frage.
Hier geht es um die Weiterentwicklung des Moduls, nicht um dessen Anwendung im Einzelfall.

Mach für Deine Frage bitte einen neuen Thread auf.

-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

efyzz

#1294
Sorry und danke für den freundlichen Hinweis!
Ich hatte den Eindruck, dass hier schon andere sehr anwendungsspezifische Fragen gestellt hatten, aber ich mag mich irren.
Neuer Thread hier:
https://forum.fhem.de/index.php?topic=136527.0

Aber was hast Du denn da für einen Screenshot angehangen? Sieht so aus, als hättest Du es ausprobiert und es funktioniert bei Dir :)
Antwort natürlich gerne im neuen Thread.

Meinetwegen dann gern meinen Beitrag oben löschen. Danke!
RaspberryPi3B, Bookworm Lite
Homematic Funkmodul HM-MOD-RPI-PCB
------------------------------------------------------------------------
Ich bin kein Programmierer ... aber ich weiß, auf welcher Seite der Lötkolben heiß ist.

fireball

Hi,

ich habe eine Frage bzgl. dem Modul.
Ich habe eine größere JSON Struktur von einem HUB, der alle Jalousien bei mir steuert.
In der Struktur sind also die Endgeräte (mit weiteren JSON Attributen), mit Räumen (mit weiteren JSON Attributen) usw.
Anbei mal ein Auszug:

{
    "Cloud": {
        "DetailedPublishing": false,
        "EnableFullScheduleTelemetry": false,
        "BlockPublishing": {
            "RoomTimeSeries": false,
            "EcoMode": false,
            "BoilerOnOffEvent": true,
            "HotWaterOnOffEvent": true,
            "PercentageDemand": true,
            "FotaProgress": false,
            "SupportPackage": false,
            "PairingToken": false,
            "Notification": false,
            "Describe": false,
            "EntireDataModel": false,
            "ScheduleUpdate": false,
            "SmartPlugUpdate": false,
            "LightUpdate": false,
            "ShutterUpdate": false,
            "TemperatureChangeEvent": false,
            "EventSeriesDiagnostic": false,
            "Heartbeat": false,
            "AutomationEvent": false,
            "SensorEvent": false,
            "EquipmentConfigEvent": false,
            "EquipmentTimeSeries": false,
            "EquipmentDeletionEvent": false,
            "EVSEActionRequest": false,
            "EquipmentSyncEvent": false,
            "ApplicationPowerEvent": false,
            "WeatherConfigEvent": false,
            "EVSocketChargingStatusChangeEvent": false,
            "EVSocketStatusChangeEvent": false,
            "PCMOnlineNotification": false
        },
        "WiserApiHost": "api-nl.wiserair.com",
        "BootStrapApiHost": "bootstrap.gl.struxurewarecloud.com",
        "FioIsRegistered": true
    },
    "HeatingChannel": [
        {
            "id": 1,
            "Name": "Channel-1",
            "PercentageDemand": 0,
            "DemandOnOffOutput": "Off",
            "HeatingRelayState": "Off",
            "IsSmartValvePreventingDemand": false,
            "DemandIsAsynchronous": true
        }
    ],
    "Room": [
        {
            "id": 1,
            "HeatingRate": 1200,
            "ClimateCapabilities": {
                "HeatingSupported": false,
                "CoolingSupported": false,
                "MinimumHeatSetpoint": 50,
                "MaximumHeatSetpoint": 300,
                "MinimumCoolSetpoint": 180,
                "MaximumCoolSetpoint": 300,
                "SetpointStep": 5,
                "AmbientTemperature": false,
                "TemperatureControl": false,
                "OpenWindowDetection": false,
                "HydronicChannelSelection": false,
                "OnOffSupported": false
            },
            "Name": "Badzimmer unten",
            "Mode": "Manual",
            "WindowDetectionActive": false,
            "OccupiedToUnoccupiedDelay": 5,
            "MinimumOccupiedTime": 20,
            "CalculatedTemperature": -32768,
            "CurrentSetPoint": -200,
            "SetpointOrigin": "FromNoControl",
            "DisplayedSetPoint": -200,
            "Invalid": "NothingAssigned",
            "EffectiveMode": "Manual",
            "ControlDirection": "None",
            "Occupancy": "Occupied",
            "OccupancyCapable": false
        },
        {
            "id": 2,
            "HeatingRate": 1200,
            "ClimateCapabilities": {
                "HeatingSupported": false,
                "CoolingSupported": false,
                "MinimumHeatSetpoint": 50,
                "MaximumHeatSetpoint": 300,
                "MinimumCoolSetpoint": 180,
                "MaximumCoolSetpoint": 300,
                "SetpointStep": 5,
                "AmbientTemperature": false,
                "TemperatureControl": false,
                "OpenWindowDetection": false,
                "HydronicChannelSelection": false,
                "OnOffSupported": false
            },
            "Name": "Badezimmer oben",
            "Mode": "Manual",
            "WindowDetectionActive": false,
            "OccupiedToUnoccupiedDelay": 5,
            "MinimumOccupiedTime": 20,
            "CalculatedTemperature": -32768,
            "CurrentSetPoint": -200,
            "SetpointOrigin": "FromNoControl",
            "DisplayedSetPoint": -200,
            "Invalid": "NothingAssigned",
            "EffectiveMode": "Manual",
            "ControlDirection": "None",
            "Occupancy": "Occupied",
            "OccupancyCapable": false
        }
    ],
    "Device": [
        {
            "id": 0,
            "NodeId": 0,
            "ProductType": "Controller",
            "ProductIdentifier": "Controller",
            "ActiveFirmwareVersion": "4.22.4",
            "ModelIdentifier": "WT704R1B30S4",
            "Type": "ZigbeeDevice",
            "UUID": "b84fc8b0-637b-5515-9acc-052049becb09",
            "DeviceLockEnabled": false,
            "DisplayedSignalStrength": "VeryGood",
            "ReceptionOfController": {
                "Rssi": -55
            }
        },
        {
            "id": 1,
            "NodeId": 15471,
            "ProductType": "Shutter",
            "ProductIdentifier": "C4BShutter",
            "ActiveFirmwareVersion": "2.10.1",
            "ModelIdentifier": "Unknown",
            "SerialNumber": "D0CF5EFFFE440746",
            "ProductModel": "1GANG/SHUTTER/1",
            "OtaImageQueryCount": 0,
            "LastOtaImageQueryCount": 3,
            "OtaVersion": 34210303,
            "OtaHardwareVersion": 256,
            "Type": "ZigbeeDevice",
            "UUID": "b4051c31-cb5b-5f51-884e-df1e716c92f2",
            "DeviceLockEnabled": false,
            "DisplayedSignalStrength": "VeryGood",
            "ReceptionOfController": {
                "Rssi": -32,
                "Lqi": 255
            },
            "BindingsStatus": "SetCorrectly",
            "ReportConfigStatus": "SetCorrectly",
            "AttributesStatus": "SetCorrectly"
        }
    ],
    "Zigbee": {
        "NetworkChannel": 20,
        "TargetEBLFile": "../../opt/efr32/firmware_2.8.0.0.bin",
        "PanId": 62004,
        "ZigbeeModuleVersion": "02.43.00.00",
        "TargetEBLFileUnsigned": "../../opt/efr32/firmware_2.8.0.0.u.bin",
        "NetworkChannelRescan": 11,
        "ZigbeeEUI": "B4E3F9FFFE47CF3A"
    },
    "UpgradeInfo": [
        {
            "id": 1,
            "FirmwareFilename": "105E-0800-00060600-0100-01FF.zigbee"
        },
        {
            "id": 2,
            "FirmwareFilename": "105E-0E00-01080000-0000-00FF.zigbee"
        },
        {
            "id": 3,
            "FirmwareFilename": "105E-0201-0000EA64-0000-0000.zigbee"
        },
        {
            "id": 4,
            "FirmwareFilename": "105E-04E1-0000A412-0000-0009.zigbee"
        },
        {
            "id": 5,
            "FirmwareFilename": "105E-04E1-0000EA63-0100-01FF.zigbee"
        },
        {
            "id": 6,
            "FirmwareFilename": "105E-05E1-00000018-0000-0200.zigbee"
        },
        {
            "id": 7,
            "FirmwareFilename": "105E-0A00-00007D02-0000-0000.zigbee"
        },
        {
            "id": 8,
            "FirmwareFilename": "105E-000B-020A01FF-0100-02FF.zigbee"
        },
        {
            "id": 9,
            "FirmwareFilename": "105E-000C-020A01FF-0100-02FF.zigbee"
        },
        {
            "id": 10,
            "FirmwareFilename": "105E-003F-020901FF-0000-01FF.zigbee"
        },
        {
            "id": 11,
            "FirmwareFilename": "105E-0016-020901FF-0000-01FF.zigbee"
        },
        {
            "id": 12,
            "FirmwareFilename": "105E-003D-020901FF-0000-01FF.zigbee"
        },
        {
            "id": 13,
            "FirmwareFilename": "105E-000D-020C02FF-0000-01FF.zigbee"
        },
        {
            "id": 14,
            "FirmwareFilename": "105E-0010-020A00FF-0000-01FF.zigbee"
        },
        {
            "id": 15,
            "FirmwareFilename": "105E-0011-020B0FFF-0000-02FF.zigbee"
        },
        {
            "id": 16,
            "FirmwareFilename": "105E-0012-020D00FF-0000-01FF.zigbee"
        },
        {
            "id": 17,
            "FirmwareFilename": "105E-04b0-01000400-0000-00FF.zigbee"
        },
        {
            "id": 18,
            "FirmwareFilename": "105E-1200-01003500-0000-00FF.zigbee"
        },
        {
            "id": 19,
            "FirmwareFilename": "105E-1201-01003500-0000-00FF.zigbee"
        },
        {
            "id": 20,
            "FirmwareFilename": "105E-1202-01003500-0000-00FF.zigbee"
        },
        {
            "id": 21,
            "FirmwareFilename": "105E-1203-01003500-0000-00FF.zigbee"
        },
        {
            "id": 22,
            "FirmwareFilename": "105E-1204-01003500-0000-00FF.zigbee"
        },
        {
            "id": 23,
            "FirmwareFilename": "120B-210B-00000022-0000-FFFF.zigbee"
        },
        {
            "id": 24,
            "FirmwareFilename": "105E-0024-01060542-0000-09FF.zigbee"
        },
        {
            "id": 25,
            "FirmwareFilename": "105E-0025-01060542-0000-09FF.zigbee"
        },
        {
            "id": 26,
            "FirmwareFilename": "105E-0026-01060542-0000-09FF.zigbee"
        },
        {
            "id": 27,
            "FirmwareFilename": "105E-0027-01060542-0000-09FF.zigbee"
        },
        {
            "id": 28,
            "FirmwareFilename": "105E-0043-020706FF-0000-0000.zigbee"
        },
        {
            "id": 29,
            "FirmwareFilename": "105E-0051-020A00FF-0000-00FF.zigbee"
        },
        {
            "id": 30,
            "FirmwareFilename": "105E-1401-01040200-020F-02FF.zigbee"
        },
        {
            "id": 31,
            "FirmwareFilename": "105E-1400-01040400-0102-01FF.zigbee"
        },
        {
            "id": 32,
            "FirmwareFilename": "105E-1403-01040200-020F-02FF.zigbee"
        },
        {
            "id": 33,
            "FirmwareFilename": "105E-1402-01040400-0102-01FF.zigbee"
        },
        {
            "id": 34,
            "FirmwareFilename": "105E-0013-020B0FFF-0000-02FF.zigbee"
        }
    ],
    "Shutter": [
        {
            "id": 1,
            "DeviceId": 1,
            "Endpoint": 5,
            "ManualLift": 100,
            "ManualTilt": 255,
            "DriveConfig": {
                "LiftOpenTime": 200,
                "LiftCloseTime": 200,
                "TiltTime": 0,
                "TiltEnabled": false,
                "TiltAngleClosed": 90,
                "TiltAngleOpen": 0
            },
            "UUID": "8d5d5d0c-0f02-58b3-9d26-c6c6bb313513",
            "IsLiftPositionSupported": true,
            "IsTiltSupported": true,
            "Name": "Bad unten",
            "RoomId": 1,
            "Mode": "Manual",
            "AwayAction": "NoChange",
            "RespectSummerComfort": true,
            "SummerComfortLift": 50,
            "SummerComfortTilt": 0,
            "CurrentLift": 100,
            "CurrentTilt": 255,
            "ControlSource": "FromManualMode",
            "TargetLift": 100,
            "TargetTilt": 255,
            "LiftMovement": "Stopped",
            "TiltMovement": "Stopped"
        }
    ],
    "DeviceCapabilityMatrix": {
        "Roomstat": true,
        "ITRV": true,
        "SmartPlug": true,
        "UFH": true,
        "UFHFloorTempSensor": true,
        "UFHDewSensor": true,
        "HACT": false,
        "LACT": false,
        "Light": true,
        "Shutter": true,
        "LoadController": true,
        "SmartSocket": true,
        "TwoGangLights": true,
        "FLS": true,
        "BoilerInterface": true,
        "WindowDoorSensor": true,
        "MotionLightSensor": true,
        "WaterLeakageSensor": true,
        "TemperatureHumiditySensor": true,
        "PowerTagE": true,
        "CFMT": true,
        "EVSE": true,
        "SmokeAlarmDevice": true,
        "Airzone": true,
        "NodOnPuck": true,
        "NodOn16APuck": true,
        "EVSocket": true,
        "FilPilotePuck": true,
        "IconicDevices": true
    },
    "FeatureCapability": {
        "Automation": {
            "MaxActions": 10,
            "MaxTriggers": 10,
            "MaxTimeConstraints": 10
        },
        "PTE": {
            "EnergyExport": true
        },
        "ClimateDemandForUI": true
    },
    "System": {
        "SunriseTimes": [
            826,
            825,
            824,
            824,
            823,
            822,
            821,
            820,
            819,
            818,
            817,
            816,
            815
        ],
        "SunsetTimes": [
            1625,
            1626,
            1628,
            1629,
            1631,
            1632,
            1634,
            1636,
            1637,
            1639,
            1641,
            1642,
            1644
        ],
        "isTrialist": false,
        "isProvisioned": true,
        "HardwareGeneration": 2,
        "SummerDiscomfortPrevention": false,
        "SummerComfortAvailable": false,
        "CloudConnectionStatus": "Connected"
    }
}

Kann man aus der Struktur automatisch alle Geräte (Device), Räume (Room) und Jalousien (Shutter) mit deren Attributen erzeugen lassen?
Ich möchte versuchen, dass HTTPMOD mir automatisch alle Geräte und Räume mit Attributen rausließt, sollte sich was ändern, soll das automatisch aktualisiert werden.
Ich tu mich aktuell schwer hier eine Idee zu entwicklen.

Ich dachte an extractAllJson, aber das müsste an einer Stelle anfangen wo ich es will.
JSONPath kann HTTPMOD nicht oder? Ich habe dafür das JsonMod-Modul gefunden, dass könnte das. zB $.Device um alle Device auszulesen?!

Wiederum würde ich gern dann dynamisch eine setURL definieren, der man dann ein Device und ein paar JSON Parameter mitgeben kann, zB den Stand der Jalousie in Prozent.

So sehen die URLs aus, die am Ende genutzt werden sollen:
PATCH /data/v2/domain/Shutter/1/RequestAction {"Action":"LiftTo", "Percentage":100}
PATCH /data/v2/domain/Shutter/1/RequestAction {"Action":"Stop"}

Viell. kann mir ja jemand einen Anschub geben?!

VG+Danke

betateilchen

Zitat von: fireball am 15 Januar 2024, 20:04:17JSONPath kann HTTPMOD nicht oder? Ich habe dafür das JsonMod-Modul gefunden, dass könnte das. zB $.Device um alle Device auszulesen?!

Ja, JsonMod ist für Dein Szenario sicher das besser geeignete Modul.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

beaune

Hallo,

ich habe gerade einen Fall, wo der Rückgabewert im JSON einer signed int 16-Darstellung entspricht. Das macht die Ausgabe von negativen Zahlen schwierig, wo man ohne Formatierungsinformationen 65xxx anstatt der Darstellung mit Minuszeichen sieht. In ModbusAttr hat man für so etwas die Attribute mit dem Anhang -unpack, wo man S oder s angeben könnte, je nachdem ob MSB oder LSB codiert ist, und damit die korrekte Darstellung in fhem erreichen würde. Es ist vielleicht etwas ungewöhnlich, dass solche Dekodieranweisungen für Rohdaten für JSON-Telegramme benötigt werden, da man dort eher eine sprechende Darstellung erwartet, tatsächlich gibt es aber solche Geräte. Vermutlich haben es sich die Entwickler da einfach gemacht und den Rohwert, so wie er über Modbus ausgegeben wird, einfach ins JSON-Telegramm kopiert wird.

Meine Frage: Können wir so etwas wie unpack auch in httpmod anbieten? Oder wie würde man so einen Fall mit den bestehenden Mitteln lösen?

Prof. Dr. Peter Henning

Ich hole mit HTTPMOD ein JSON-Array mit 16 Einträgen, sagen wir mit dem Attribut
readingXXJSON nrgAus den ersten vier Einträgen des Arrays erstelle ich dann gemeinsames Reading, in dem diese durch " - " Strings getrennt werden.

Erstaunlicherweise geht das mit dem Attribut
readingXXRecombineExpr sprintf "%.1f - %.1f - %.1f - %.1f",$matchlist[0],$matchlist[1],$matchlist[8],$matchlist[9]Ich habe eine Weile gebraucht, um das zu kapieren: Im Perl-Array @matchlist sind die Einträge des JSON-Array nicht in nummerischer, sondern in lexikalischer Sortierung gespeichert, also in der Reihenfolge

0-1-10-11-12-13-14-15-2-3-4-5-6-7-8-9.

Will man also auf dritten Eintrag des JSON-Arrays zugreifen (der hat ja den Index 2), muss das aus dem Perl-Array der Eintrag mit dem Index 8 sein.

Das kann man zwar alles machen, und die Sache funktioniert ja jetzt. Eine Änderung im Modul ist also nicht nötig, aber das sollte in der CommandRef vermerkt werden.

LG

pah

StefanStrobel

Hallo pah,

vielen Dank für den Hinweis, ich habe es in der Doku vermerkt und checke es mit der nächsten Änderung ein.

Gruss
   Stefan

StefanStrobel

Zitat von: beaune am 16 Januar 2024, 10:53:05Meine Frage: Können wir so etwas wie unpack auch in httpmod anbieten? Oder wie würde man so einen Fall mit den bestehenden Mitteln lösen?

Hallo beaune, Du kannst in einer ReadingExpr auch pack / unpack aufrufen.
Sowas wie
unpack ("s", pack ('S', $val))

Packt den Wert erst als 16 bit unsigned und enpackt ihn dann als 16 Bit signed int.

Gruss
  Stefan

fireball

Zitat von: betateilchen am 15 Januar 2024, 20:08:58
Zitat von: fireball am 15 Januar 2024, 20:04:17JSONPath kann HTTPMOD nicht oder? Ich habe dafür das JsonMod-Modul gefunden, dass könnte das. zB $.Device um alle Device auszulesen?!

Ja, JsonMod ist für Dein Szenario sicher das besser geeignete Modul.



Hi,

ich bräuchte nochmal ein bisl Anschub...

Ich habe mir mit JsonMOD jetzt alle interessanten Werte aus meinem Jalousiehub rausgelesen.

Ich würde jetzt gern EIN HTTPMOD Device erzeugen, mit EINER setURL, die ich für alle Jalousien nehmen kann.
Die URL sehen wie oben beschrieben so aus:
PATCH /data/v2/domain/Shutter/1/RequestAction {"Action":"LiftTo", "Percentage":100}
PATCH /data/v2/domain/Shutter/1/RequestAction {"Action":"Stop"}

Bei mir muss die 1 immer durch den Wert der ensprechenden Jalousie ersetzt werden und im data-Feld muss ich 1-n Werte ersetzen können.

Ich würde dafür gern readingsProxys erstellen, pro Jalousie einen. Diesen kann ich mit div. readings aus dem JSONMOD anreichern.
Dann ein HTTPMOD mit der SetURL.
PATCH /data/v2/domain/Shutter/$$VALUE1$$/RequestAction {"Action":"$$VALUE3$$", "Percentage":$$VALUE3$$}Ich finde aktuell nur die Möglichkeit einen Wert zu übergeben, $val, aber es gibt doch bestimmt mit den replacements etc. auch die Möglichkeit mehrere Werte zu ersetzen?!
Dann sollten in setFn des readingsProxy nur die 3 Werte übergeben werden und die setURL führt dann die Befehle aus?!
Oder könnte man zB $$VALUE1$$ immer mit einem Wert des aufrufenden Device füllen?!

Irgendwie strauchle ich hier...
Ich wollte vermeiden, einfach 15 SetURLs anzulegen, wo ich $$VALUE1$$ schon fest definiert habe...
VG+Danke
René

beaune

Zitat von: StefanStrobel am 29 Januar 2024, 14:45:59
Zitat von: beaune am 16 Januar 2024, 10:53:05Meine Frage: Können wir so etwas wie unpack auch in httpmod anbieten? Oder wie würde man so einen Fall mit den bestehenden Mitteln lösen?

Hallo beaune, Du kannst in einer ReadingExpr auch pack / unpack aufrufen.
Sowas wie
unpack ("s", pack ('S', $val))

Packt den Wert erst als 16 bit unsigned und enpackt ihn dann als 16 Bit signed int.

Gruss
  Stefan

Funktioniert wunderbar, vielen Dank für den Tipp!

fireball

Hi,

Bekommt man in httpmod, wenn man einen readingsproxy draufgesetz hat, auch das aufrufende device raus?

Vg und danke

Prof. Dr. Peter Henning

Ich verstehe die Frage nicht - was ist mit "aufrufendem Device" gemeint?

LG

pah