Gå til innhold
  • Bli medlem
Støtt hjemmeautomasjon.no!

Sonoff Pow moduler med HS3 MQTT


Jepsh

Anbefalte innlegg

Har kjøpt noen Sonoff Pow moduler som jeg ønsker å implementere i HS3 via MQTT plugin.

Pow enhetene er flashet med firmware fra https://github.com/arendst/Sonoff-Tasmota.

Alt er integrert greit med MQTT og HS3 og jeg kan slå av og på enhetene.

Utfordringen er å få inn Watt osv i HS3. Pow enhetene sender en json string som må parses for å lese ut watt verdien. Jeg får inn hele denne string i HS3: 

{"Time":"2017-03-05T11:27:13", "Yesterday":0.008, "Today":0.016, "Period":0, "Power":0, "Factor":0.00, "Voltage":0, "Current":0.000}

Noen som har gjort dette eller vet hvordan det må parses?

 

  • Like 1
Lenke til kommentar
Del på andre sider

Hvis du kan scripte, så ville jeg brukt RegEx for å finne "Power" og lese ut tallet bak kommaet. Kan også gjøres med enkel med strenghåndtering.

 

Her er et utgangspunkt, men du kan ikke putte det rett i et script:

 
        Dim input As String = "{'Time':  '2017-03-05T11:27:13', 'Yesterday':0.008, 'Today':0.016, 'Period':0, 'Power':0, 'Factor':0.00, 'Voltage':0, 'Current':0.000}"

        Dim searchStart As String = "'Today':"
        Dim searchEnd As String = ","
        Dim indexStart As Integer = input.IndexOf(searchStart) + searchStart.Length
        Dim indexStop As Integer = input.IndexOf(searchEnd, indexStart)
        Dim value As Double = CDbl(input.Substring(indexStart, indexStop - indexStart).Replace(".", ","))
        Console.WriteLine(value)
        Console.ReadKey()

 

Lenke til kommentar
Del på andre sider

Har bygget litt videre på scriptet du skrev som utgangspunkt. Ser ut som det funker, men lurer på om det er riktig ("best practice") måte å gjøre det på?

Sub Main(Optional ByVal pParms As String = "")
Const dvref As Integer = 200

Dim input As String = (hs.DeviceString(dvref).Replace("""", ""))

        Dim searchStart As String = "Today:"
        Dim searchEnd As String = ","
        Dim indexStart As Integer = input.IndexOf(searchStart) + searchStart.Length
        Dim indexStop As Integer = input.IndexOf(searchEnd, indexStart)
        Dim value As Double = CDbl(input.Substring(indexStart, indexStop - indexStart).Replace(".", ","))
        hs.SetDeviceValueByRef(201, value, True)
End Sub

Har opprettet en ny virtual device i HS3 som har ID 201 som hetter "kWh today". 

Dette script kjøres da automatisk fra en event hver gang ID 200 (device som får info fra MQTT ) har en ny value set.

Endret av Jepsh
  • Like 1
Lenke til kommentar
Del på andre sider

Prøver å lære meg RegEx, så jeg skrev om scriptet ditt litt. Kunne du testet dette for meg?

 

    Sub Main(ByVal parameters As String)
        Const dvref As Integer = 200

        Dim input As String = hs.DeviceString(dvref)
        Dim regex As New Text.RegularExpressions.Regex("(?<=""Today"":)[^,]+(?=,)")
        Dim match As Text.RegularExpressions.Match = regex.Match(input)

        If match.Success Then
            Dim value As Double = CDbl(match.Groups(0).Value)
            hs.SetDeviceValueByRef(201, value, True)
        End If
    End Sub

 

Lenke til kommentar
Del på andre sider

Ah, pokker! Jeg har jo en ekstra sak jeg glemte å legge til. Det korrekte er her:

 

    Sub Main(ByVal parameters As String)
        Const dvref As Integer = 200

        Dim input As String = hs.DeviceString(dvref)
        Dim regex As New Text.RegularExpressions.Regex("(?<=""Today"":)[^,]+(?=,)")
        Dim match As Text.RegularExpressions.Match = regex.Match(input)

        If match.Success Then
            Dim value As Double = CDbl(match.Groups(0).Value.Replace(".", ","))
            hs.SetDeviceValueByRef(201, value, True)
        End If
    End Sub

... der .Replace(".", ",") er det eneste nye.

Lenke til kommentar
Del på andre sider

*sukk* alltid er det noe...

La oss prøve å bytte ut if'en med dette:

        If match.Success Then
            Dim value As Double = CDbl(match.Groups(0).Value.Replace(".", ","))
            hs.SetDeviceValueByRef(201, value, True)
            hs.WriteLog("RegEx test", "The value was set to: " & value)
		Else
            hs.WriteLog("RegEx test", "No match! :(")	
        End If

... da skal vi i det minste se i loggen hva som skjer...

Lenke til kommentar
Del på andre sider

Sorry! Testet med den nye If block nå og det så bra ut i loggen.

Kom i tanke om device setting - Do not update device last change time if device value does not change. Denne var selvfølgelig enabled.

Testet da igjen med det første regex scriptet du sendte og da så alt bra ut ?

Her er scriptet jeg bruker akkurat nå: 

Sub Main(ByVal pParms As String)
    Dim dvref() As String = Split(pParms.ToString, "|")

    Dim input As String = hs.DeviceString(dvref(0))
    Dim regex As New Text.RegularExpressions.Regex("(?<=""Today"":)[^,]+(?=,)")
    Dim match As Text.RegularExpressions.Match = regex.Match(input)

    If match.Success Then
        Dim value As Double = CDbl(match.Groups(0).Value.Replace(".", ","))
        hs.SetDeviceValueByRef(dvref(1), value, True)
    End If
End Sub

Det tar da parametre input|output

Neste versjon må være med parameter hvor man kan spesifisere today, yesterday, power, voltage og current :)

 

Et lite spørsmål på siden her - hvordan får jeg denne device inkludert i HS3 sin Energy logging?

Lenke til kommentar
Del på andre sider

4 minutter siden, Jepsh skrev:

Det tar da parametre input|output

Foreslår parameter|input|output. Og så erstatte Regex("(?<=""Today"":)[^,]+(?=,)") med dette: Regex("(?<=""" & dvref(0) & """:)[^,]+(?=,)")

 

Men istedenfor å bruke dvRef() ville jeg definerte eksplisitte variabler. (F.eks. Dim parameter as String = pParms.Split("|")(0), etc).

 

Lenke til kommentar
Del på andre sider

Bli med i samtalen

Du kan publisere innhold nå og registrere deg senere. Hvis du har en konto, logg inn nå for å poste med kontoen din.

Gjest
Skriv svar til emnet...

×   Du har limt inn tekst med formatering.   Lim inn uten formatering i stedet

  Du kan kun bruke opp til 75 smilefjes.

×   Lenken din har blitt bygget inn på siden automatisk.   Vis som en ordinær lenke i stedet

×   Tidligere tekst har blitt gjenopprettet.   Tøm tekstverktøy

×   Du kan ikke lime inn bilder direkte. Last opp eller legg inn bilder fra URL.

×
×
  • Opprett ny...

Viktig informasjon

Vi har plassert informasjonskapsler/cookies på din enhet for å gjøre denne siden bedre. Du kan justere dine innstillinger for informasjonskapsler, ellers vil vi anta at dette er ok for deg.